HTTP/1.x 缺陷
HTTP/1.x 实现简单是以牺牲性能为代价的:
- 客户端需要使用多个连接才能实现并发和缩短延迟;
- 不会压缩请求和响应首部,从而导致不必要的网络流量;
- 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下。
HTTP/2 新特性
二进制传输: HTTP/2 中所有加强性能的核心点在于此。在之前的 HTTP 版本中,我们是通过文本的方式传输数据。在 HTTP/2 中引入了新的编码机制,将报文分成 headers 帧和 data 帧,它们都是二进制格式的,所有传输的数据都会被分割,并采用二进制格式编码。
服务端 Push: 在 HTTP/2 中,服务端可以在客户端某个请求后,主动推送其他资源。这样就可以相对减少一点延迟时间。
首部压缩:在 HTTP/1 中,我们使用文本的形式传输 header,在 header 携带 cookie 的情况下,可能每次都需要重复传输几百到几千的字节。HTTP/2.0 要求客户端和服务器在两端维护了索引表,用于记录出现过的 header 从而避免了重复传输。不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。
多路复用: 在 HTTP/2 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。
多路复用很好的解决了浏览器限制同一个域名下的请求数量的问题,同时也接更容易实现全速传输,毕竟新开一个 TCP 连接都需要慢慢提升传输速度。
HTTP/1.x 与 HTTP/2 的关键区别
- 二进制协议代替文本协议,更加简洁高效
- 针对每个域只使用一个多路复用的连接
- 压缩头部信息减小开销
- 允许服务器主动推送应答到客户端的缓存中
总结
- HTTP/2 通过多路复用、二进制流、Header 压缩等等技术,极大地提高了性能,但是还是存在着问题的
- QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议
HTTP/2 Server Push
2022 年 6 月 Chrome 官方宣布在 chrome 103 版本对 HTTP 103 状态码提供了支持;
Chrome 官方也宣布在 chrome 106 版本对 HTTP/2 Server Push 进行禁用;
然后再引诱面试官问为什么要禁用 HTTP/2 Server Push;
队头阻塞了解吗?
先回答 HTTP 队头阻塞,是怎么产生的;
然后回答 HTTP2 怎么解决了 HTTP 队头阻塞;
并且抛出包袱 HTTP2 只解决了 HTTP 队头阻塞,根本的 TCP 队头阻塞还没有解决;
然后就可以聊一聊 HTTP3(Quic)相关的内容;
http2.0 新特性
- 二进制传输
- 多路复用
- Header 压缩
- 主动推送